<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>尝试聚合 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/_aggregation_test_drive.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/_aggregation_test_drive.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/_aggregation_test_drive.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/_aggregation_test_drive.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="aggregations.html">聚合</a></span>
»
<span class="breadcrumb-node">尝试聚合</span>
</div>
<div class="navheader">
<span class="prev">
<a href="_combining_the_two.html">« 桶和指标的组合</a>
</span>
<span class="next">
<a href="_adding_a_metric_to_the_mix.html">添加度量指标 »</a>
</span>
</div>
<div class="chapter">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="_aggregation_test_drive"></a>尝试聚合 (Aggregation Test-Drive)<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/300_Aggregations/20_basic_example.asciidoc">edit</a>
</h2>
</div></div></div>
<p>我们可以用以下几页定义不同的聚合和它们的语法， 但学习聚合的最佳途径就是用实例来说明。
一旦我们获得了聚合的思想，以及如何合理地嵌套使用它们，那么语法就变得不那么重要了。</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>聚合的桶操作和度量的完整用法可以在 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/5.6/search-aggregations.html" class="ulink" target="_top">Elasticsearch 参考</a> 中找到。本章中会涵盖其中很多内容，但在阅读完本章后查看它会有助于我们对它的整体能力有所了解。</p>
</div>
</div>
<p>所以让我们先看一个例子。我们将会创建一些对汽车经销商有用的聚合，数据是关于汽车交易的信息：车型、制造商、售价、何时被出售等。</p>
<p>首先我们批量索引一些数据：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">POST /cars/transactions/_bulk
{ "index": {}}
{ "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
{ "index": {}}
{ "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
{ "index": {}}
{ "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
{ "index": {}}
{ "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }</pre>
</div>
<div class="sense_widget" data-snippet="snippets/300_Aggregations/20_basic_example.json"></div>
<p>有了数据，开始构建我们的第一个聚合。汽车经销商可能会想知道哪个颜色的汽车销量最好，用聚合可以轻易得到结果，用 <code class="literal">terms</code> 桶操作：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /cars/transactions/_search
{
    "size" : 0,
    "aggs" : { <a id="CO184-1"></a><i class="conum" data-value="1"></i>
        "popular_colors" : { <a id="CO184-2"></a><i class="conum" data-value="2"></i>
            "terms" : { <a id="CO184-3"></a><i class="conum" data-value="3"></i>
              "field" : "color"
            }
        }
    }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/300_Aggregations/20_basic_example.json"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO184-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>聚合操作被置于顶层参数  <code class="literal">aggs</code> 之下（如果你愿意，完整形式 <code class="literal">aggregations</code> 同样有效）。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO184-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>然后，可以为聚合指定一个我们想要名称，本例中是： <code class="literal">popular_colors</code> 。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO184-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>最后，定义单个桶的类型 <code class="word">terms</code> 。</p>
</td>
</tr>
</table>
</div>
<p>聚合是在特定搜索结果的上下文中执行的， 这也就是说它只是查询请求的另外一个顶级参数（例如，使用 <code class="literal">/_search</code> 终端）。
聚合可以与查询结对，但我们会晚些在 <a class="xref" href="_scoping_aggregations.html" title="范围限定的聚合">限定聚合的范围（Scoping Aggregations）</a> 中来解决这个问题。</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>可能会注意到我们将 <code class="literal">size</code> 设置成 0 。我们并不关心搜索结果的具体内容，所以将返回记录数设置为 0 来提高查询速度。
设置 <code class="literal">size: 0</code> 与 Elasticsearch 1.x 中使用 <code class="literal">count</code> 搜索类型等价。</p>
</div>
</div>
<p>然后我们为聚合定义一个名字，名字的选择取决于使用者，响应的结果会以我们定义的名字为标签，这样应用就可以解析得到的结果。</p>
<p>随后我们定义聚合本身，在本例中，我们定义了一个 <code class="word">terms</code> 桶。  这个 <code class="literal">terms</code> 桶会为每个碰到的唯一词项动态创建新的桶。
因为我们告诉它使用 <code class="word">color</code> 字段，所以 <code class="word">terms</code> 桶会为每个颜色动态创建新桶。</p>
<p>让我们运行聚合并查看结果：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
...
   "hits": {
      "hits": [] <a id="CO185-1"></a><i class="conum" data-value="1"></i>
   },
   "aggregations": {
      "popular_colors": { <a id="CO185-2"></a><i class="conum" data-value="2"></i>
         "buckets": [
            {
               "key": "red", <a id="CO185-3"></a><i class="conum" data-value="3"></i>
               "doc_count": 4 <a id="CO185-4"></a><i class="conum" data-value="4"></i>
            },
            {
               "key": "blue",
               "doc_count": 2
            },
            {
               "key": "green",
               "doc_count": 2
            }
         ]
      }
   }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO185-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>因为前面设置了参数<code class="literal">size</code>为0，所以不会有匹配的搜索结果(<code class="literal">hits</code>)返回。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO185-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p><code class="word">popular_colors</code> 聚合是作为 <code class="literal">aggregations</code> 字段的一部分被返回的。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO185-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>每个桶的 <code class="literal">key</code> 都与 <code class="word">color</code> 字段里找到的唯一词对应。它总会包含 <code class="literal">doc_count</code> 字段，告诉我们包含该词项的文档数量。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO185-4"><i class="conum" data-value="4"></i></a></p>
</td>
<td align="left" valign="top">
<p>每个桶的数量代表该颜色的文档数量。</p>
</td>
</tr>
</table>
</div>
<p>响应包含多个桶，每个对应一个唯一颜色（例如：红 或 绿）。每个桶也包括 <code class="literal">落入</code> 该桶的所有文档的数量。例如，有四辆红色的车。</p>
<p>前面的这个例子完全是实时执行的：一旦文档可以被搜到，它就能被聚合。这也就意味着我们可以直接将聚合的结果源源不断的传入图形库，然后生成实时的仪表盘。
不久，你又销售了一辆银色的车，我们的图形就会立即动态更新银色车的统计信息。</p>
<p>瞧！这就是我们的第一个聚合！
</p>



</div>
<div class="navfooter">
<span class="prev">
<a href="_combining_the_two.html">« 桶和指标的组合</a>
</span>
<span class="next">
<a href="_adding_a_metric_to_the_mix.html">添加度量指标 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>